from tkinter import Tk, Label, Entry, Button
import time
from threading import Thread
import pygame
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# --------------------本次思路是-------------------------------
# 1.先寻找新的消息数量找到就报警
# 2.找到后鼠标移动过去
# 3.在出现的聊天框里面再次寻找出现的新的消息数量，并点击
# 4.找到文本框元素并输入文本，最后点击发送
# 此项pass--不可使用留待以后学习更多知识之后看下能否完善
# --------------------------------------------------------------


# 设置浏览器的用户数据目录
chrome_options = Options()
chrome_options.add_argument(
    "--user-data-dir=C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default")

# 初始化 Chrome 浏览器
# 创建全局变量 driver
driver = webdriver.Chrome(options=chrome_options)


def wait_for_inputs():
    while not entry1.get() or not entry2.get():
        root.update_idletasks()  # 更新界面


# 用于等待的函数
def wait_for_element(driver0, xpath, timeout=30):
    try:
        element = WebDriverWait(driver, timeout).until(
            ec.presence_of_element_located((By.XPATH, xpath))
        )
        return element
    except TimeoutException:
        return None


def open_chrome():
    wait_for_inputs()  # 等待用户输入
    driver.get("https://www.douyin.com/user/self?showTab=post")  # 请将此处的网址替换为你要跳转的实际网址
    # time.sleep(40)


def run_code():
    """
    执行具体的操作
    """
    current_cycle = 0  # 初始化当前循环次数为 0
    for _ in range(int(entry2.get())):
        # 在循环中使用
        current_cycle += 1  # 在每次循环开始前增加循环次数
        root.title(f"抖音监控私信 - 第 {current_cycle} 次循环")  # 更新标题
        if current_cycle == int(entry2.get()):
            root.title("当前循环结束")
        try:
            # element = wait_for_element(driver,
            #                            "/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
            #                            "2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div["
            #                            "2]/div/div[1]/div/div/div[3]/div")
            # 登录成功后的页面直接查询等待是否有新的信息出现
            element = wait_for_element(driver,
                                       "/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
                                       "2]/div/pace-island/div/ul[2]/div/li/div/div/div[2]/div")
            if element:  # 如果出现新的信息
                # 元素找到，执行操作
                value = element.text
                print("元素的值：", value)
                # 在窗口上显示信息
                print("出现新的信息，开始执行警报")
                # 初始化 pygame 的混音器
                pygame.mixer.init()
                # 加载声音文件
                sound = pygame.mixer.Sound("D:/mp3/XX.wav")
                # 播放声音
                sound.play()
                pygame.time.wait(2000)  # 等待 2 秒
                # 停止音乐
                pygame.mixer.music.stop()
                tk_label.config(text="注意有新的信息出现，请及时查看")
                tk_label.after(10000, lambda: tk_label.config(text=""))
                # 将鼠标移动到元素位置并点击
                action = webdriver.ActionChains(driver)
                action.move_to_element(element).click().perform()
                # 查找点击信息后在聊天框出现的信息，这个是一定会找到的
                element = wait_for_element(driver,
                                           "/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
                                           "2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div["
                                           "2]/div/div[1]/div/div/div[3]/div")

                action = webdriver.ActionChains(driver)
                action.move_to_element(element).click().perform()

                # 找到文本框 进行输入  文本后面+\n 这个功能不好，容易发送失败
                text_block = driver.find_element(By.CLASS_NAME, "public-DraftStyleDefault-block")
                text_block.send_keys(
                    "你好，世界")
                element0 = driver.find_element(By.CLASS_NAME, "sCp7KhBv.e2e-send-msg-btn")
                print("准备进行点击发送按钮")
                # 执行鼠标点击操作
                element0.click()

                # 点击退出会话
                element2 = driver.find_element(By.CLASS_NAME, "F2qAlnLO")
                element2.click()

                # # 等待用户输入的间隔时间
                time.sleep(int(entry1.get()))
            else:
                # 元素未找到，处理情况
                print("暂时没有新的消息，跳过")
                tk_label.config(text="暂时没有新的消息，跳过")
                tk_label.after(5000, lambda: tk_label.config(text=""))
        except NoSuchElementException as e:
            print(f"找不到元素：{e}")


def thread_runner():
    """
    在新线程中运行 run_code 函数
    """
    Thread(target=run_code).start()


root = Tk()
root.title("抖音监控私信")
root.geometry("250x110")  # 设置窗口大小为 300x100

tk_label = Label(root, text="结果展示", width=30, bd=10, bg="yellow")
tk_label.pack(pady=3)

# 创建第一个输入框和其上方的文字标签
label1 = Label(root, text="间隔时间：")
label1.pack()
label1.place(x=0, y=50)
entry1 = Entry(root, width=8)
entry1.pack()
entry1.place(x=60, y=50)
# 创建第二个输入框和其上方的文字标签
label2 = Label(root, text="循环次数：")
label2.pack()
label2.place(x=0, y=80)
entry2 = Entry(root, width=8)
entry2.pack()
entry2.place(x=60, y=80)


# 设置按钮的函数
def set_buttons():
    button2 = Button(root, text="登录", width=5, command=open_chrome)
    button2.pack(pady=10)
    button2.place(x=135, y=60)

    button = Button(root, text="运行", width=5, command=thread_runner)
    button.pack(pady=10)
    button.place(x=195, y=60)


set_buttons()
root.mainloop()